import type { ConfigEnv, PluginOption, UserConfig } from 'vite' // Vite 类型定义
import fs from 'node:fs'
import path from 'node:path'
import process from 'node:process' // Node.js 进程信息
import viteVue from '@vitejs/plugin-vue' // Vue 3 支持
import viteVueJsx from '@vitejs/plugin-vue-jsx' // Vue JSX 支持
import { visualizer as viteVisualizerPlugin } from 'rollup-plugin-visualizer' // 打包分析工具
import AutoImport from 'unplugin-auto-import/vite' // API 自动导入
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'
import Components from 'unplugin-vue-components/vite' // 组件自动导入
import { loadEnv } from 'vite' // Vite 环境变量加载器
import { ViteEjsPlugin } from 'vite-plugin-ejs' // EJS 模板支持
// import EslintPlugin from 'vite-plugin-eslint' // ESLint 检查
import { createHtmlPlugin as viteHtmlPlugin } from 'vite-plugin-html' // HTML 处理
import { viteMockServe } from 'vite-plugin-mock'
import progress from 'vite-plugin-progress' // 构建进度条
// import Stylelint from 'vite-plugin-stylelint' // 样式检查
import viteVueDevTools from 'vite-plugin-vue-devtools' // Vue DevTools 增强

// 获取项目根目录路径
const root = process.cwd()

// 路径解析工具函数
const pathResolve = (dir: string) => {
  return path.resolve(root, '.', dir)
}

// 读取并解析 package.json 文件内容
const readPackageJSON = async (pathDir: string): Promise<Record<string, any>> => {
  try {
    const targetPath = path.resolve(pathDir, 'package.json')
    const data = fs.readFileSync(targetPath, 'utf8')
    return JSON.parse(data as any)
  } catch (error: any) {
    throw error
  }
}

/**
 * Vite 配置生成函数
 * @param {ConfigEnv} param - Vite 配置参数
 * @param {string} param.command - Vite 命令类型 ('serve' | 'build')
 * @param {string} param.mode - 环境模式 ('development' | 'production' | 'test')
 */
export default async ({ command, mode }: ConfigEnv): Promise<UserConfig> => {
  // 加载环境变量配置
  const envConf = loadEnv(mode, root)

  // 环境标识变量
  const isDev = mode === 'development' // 开发环境标识
  const _isTest = mode === 'test' // 测试环境标识
  const _isProd = mode === 'production' // 生产环境标识
  const _isBuild = command === 'build' // 构建命令标识

  // 从环境变量中解构配置项
  const {
    VITE_DEVTOOLS, // Vue DevTools 开关
    VITE_NITRO_MOCK, // Mock 服务开关
    VITE_VISUALIZER, // 打包分析开关
    VITE_GLOB_BASE // 基础URL
  } = envConf

  // 读取项目依赖信息
  const { dependencies = {}, peerDependencies = {} } = await readPackageJSON('./')
  // 合并所有外部依赖包名
  const externalPackages = [...Object.keys(dependencies), ...Object.keys(peerDependencies)]

  return {
    base: VITE_GLOB_BASE || '/', // 部署基础路径
    root, // 项目根目录

    // 开发服务器配置
    server: {
      port: 9528, // 开发服务器端口
      host: true, // 监听所有地址
      open: true, // 自动打开浏览器
      proxy: {
        // 接口代理配置
        '/api': {
          target: 'https://172.16.120.131:8848/', // 目标服务器
          ws: false, // 禁用 WebSocket
          changeOrigin: true, // 修改请求头中的 Origin
          secure: false,
          rewrite: (url) => url.replace(/^\/api/, '') // 路径重写
        }
      }
    },

    // 插件配置
    plugins: [
      // 核心插件配置
      viteVue(), // Vue 3 支持
      viteVueJsx(), // JSX 支持
      progress(), // 构建进度条

      // 自动导入 Vue 和 antd-deign-vue 组件
      AutoImport({
        include: [
          /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx 文件
          /\.vue$/, // .vue 文件
          /\.vue\?vue/, // .vue 文件
          /\.md$/ // .md 文件
        ],
        imports: ['vue', 'vue-router'], // 自动引入的 API
        dts: 'src/types/auto-imports.d.ts', // 生成声明文件
        resolvers: [AntDesignVueResolver()], // 使用 antd-deign-vue 的解析器
        eslintrc: {
          enabled: false, // 关闭自动生成 ESLint 配置
          filepath: './.eslintrc-auto-import.json',
          globalsPropValue: true
        }
      }),
      // 自动注册 Vue 组件
      Components({
        dts: 'src/types/auto-components.d.ts', // 生成声明文件
        resolvers: [AntDesignVueResolver({ importStyle: false })], // 使用 antd-deign-vue 解析器
        globs: ['src/components/**/src/**.{vue}', '!src/components/basics/**'] // 自定义组件路径，排除特定组件
      }),

      // // 代码质量检查插件
      // EslintPlugin({
      //   cache: false, // 禁用缓存
      //   include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查范围
      // }),
      // Stylelint({
      //   exclude: ['node_modules', 'virtual:', 'assets', 'locales'], // 排除文件
      //   cache: false // 禁用缓存
      // }),

      // 基础工具插件
      ViteEjsPlugin(envConf), // EJS 模板支持

      // 条件性插件（根据环境和配置动态启用）
      isDev ? null : viteHtmlPlugin({ minify: true }), // 生产环境 HTML 压缩
      ['true', true].includes(VITE_DEVTOOLS) && isDev ? viteVueDevTools() : null, // 开发工具
      ['true', true].includes(VITE_VISUALIZER) && !isDev
        ? viteVisualizerPlugin({
            filename: './node_modules/.cache/visualizer/stats.html',
            gzipSize: true,
            open: true
          })
        : null,
      ['true', true].includes(VITE_NITRO_MOCK)
        ? viteMockServe({
            mockPath: 'mock',
            enable: true
          })
        : null // Mock 服务
    ].filter(Boolean) as PluginOption[],

    // CSS 预处理器配置
    css: {
      preprocessorOptions: {
        scss: {
          // 全局 SCSS 混入
          additionalData: "@use '@/styles/mixin.scss' as *;",
          api: 'modern' // 使用现代 API
        }
      }
    },

    // 路径解析配置
    resolve: {
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss', '.css'], // 自动解析的扩展名
      alias: {
        '@': pathResolve('src'), // 源码路径别名
        'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js' // i18n 路径别名（解决警告）
      }
    },

    // 依赖优化配置
    optimizeDeps: {
      include: externalPackages, // 预构建包含的依赖
      exclude: [] // 预构建排除的依赖
    },

    // 构建配置
    build: {
      target: 'es2015', // 目标环境
      sourcemap: false, // 禁用 sourcemap
      chunkSizeWarningLimit: 4000, // 块大小警告限制（KB）
      rollupOptions: {
        output: {
          // 静态资源分类打包
          chunkFileNames: 'static/js/[name]-[hash].js', // JS 块文件命名
          entryFileNames: 'static/js/[name]-[hash].js', // 入口文件命名
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]' // 资源文件命名
        }
      }
    },

    // ESBuild 配置
    esbuild: {
      pure: isDev ? [] : ['console'], // 生产环境移除 console
      drop: isDev ? [] : ['debugger'], // 生产环境移除 debugger
      legalComments: 'none' // 移除所有注释
    }
  }
}
